export const evalFn = () => {
	return {
		switchTab(obj = {}) {
			wx.switchTab(obj)
		},
		reLaunch(obj = {}) {
			wx.reLaunch(obj)
		},
		redirectTo(obj = {}) {
			wx.redirectTo(obj)
		},
		navigateTo(obj = {}) {
			wx.navigateTo(obj)
		},
		navigateBack(obj = {}) {
			wx.navigateBack(obj)
		},
		navigateToMiniProgram(obj = {}) {
			wx.navigateToMiniProgram(obj)
		}
	}
}


function parseCommandAndArgs(str) {
	const regex = /^([^:]+):\s*(.*)$/;

	const match = str.match(regex);
	if (match) {
		
		return {
			command: match[1].trim(),
			args: match[2].trim()
		};
	} else {
		return null;
	}
}

export const execFn = (str) => {
	if (!str || str == 'share' || str == 'qyQrcodePopup' || str == 'zwcx') {
		return str
	}
	const obj = parseCommandAndArgs(str)
	if (obj) {
		if (!obj.args) {
			evalFn()[obj.command]()
		} else {
			if (looksLikeObjectLiteral(obj.args)) {
				evalFn()[obj.command](parseObjectLiteral(obj.args))
			} else {
				evalFn()[obj.command](obj.args.split(','))
			}
		}
	} else {
		wx.navigateTo({
			url: str
		})
	}

}

function parseObjectLiteral(str) {
	// 将对象字面量中的键用双引号包裹，使其成为有效的 JSON 格式
	const jsonStr = str.replace(/(\s*){(\s*)/g, '{"')
		.replace(/:\s*/g, '":')
		.replace(/,\s*/g, ',"')
		.replace(/'\s*/g, '"')
		.replace(/(\s*)}(\s*)/g, '}');
	try {
		return JSON.parse(jsonStr);
	} catch (e) {
		console.error('Failed to parse object literal:', e);
		return null;
	}
}

function looksLikeObjectLiteral(str) {
	// 正则表达式用于匹配类似对象字面量的字符串。
	// 注意：这是一个基本的匹配，可能不覆盖所有有效或无效的情况。
	const objLiteralRegex = /^\{(?:[^{}:"']+|"(?:\\.|[^"])*"|'(?:\\.|[^'])*'|(?:(?<=:)\s*(?={))|:|\s|,)*\}$/;

	return objLiteralRegex.test(str);
}